package service

import (
	"fmt"
	"os"
	"os/exec"
	"strings"
	
	"git-todo/model"
)

// GitService 实现Git操作的服务
type GitService struct{}

// NewGitService 创建新的Git服务实例
func NewGitService() model.GitRepository {
	return &GitService{}
}

// GetCurrentBranch 获取当前Git分支名称
func (g *GitService) GetCurrentBranch() (string, error) {
	// 首先检查git命令是否可用
	if !g.isGitAvailable() {
		return "", fmt.Errorf("git命令不可用，请确保git已安装并在PATH环境变量中")
	}
	
	// 检查是否为Git仓库
	if !g.IsGitRepository() {
		wd, _ := os.Getwd()
		return "", fmt.Errorf("当前目录不是Git仓库 (工作目录: %s)", wd)
	}
	
	// 执行git命令获取当前分支，在用户当前工作目录中执行
	cmd := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD")
	
	// 获取用户当前工作目录
	wd, err := os.Getwd()
	if err != nil {
		return "", fmt.Errorf("无法获取当前工作目录: %v", err)
	}
	cmd.Dir = wd
	
	// 设置环境变量，确保git命令能正常执行
	cmd.Env = g.getEnvWithGitPath()
	
	output, err := cmd.Output()
	if err != nil {
		return "", fmt.Errorf("获取当前分支失败 (工作目录: %s): %v", wd, err)
	}
	
	branch := strings.TrimSpace(string(output))
	if branch == "HEAD" {
		// 处理detached HEAD状态
		return "", fmt.Errorf("当前处于detached HEAD状态，请先切换到一个分支")
	}
	
	return branch, nil
}

// IsGitRepository 检查git命令执行目录是否为Git仓库
func (g *GitService) IsGitRepository() bool {
	// 首先检查git命令是否可用
	if !g.isGitAvailable() {
		return false
	}
	
	cmd := exec.Command("git", "rev-parse", "--git-dir")
	
	// 获取用户当前工作目录
	wd, err := os.Getwd()
	if err != nil {
		// 如果无法获取当前工作目录，返回false
		return false
	}
	cmd.Dir = wd
	
	// 设置环境变量，确保git命令能正常执行
	cmd.Env = g.getEnvWithGitPath()
	
	// 执行命令并捕获错误输出
	err = cmd.Run()
	return err == nil
}

// isGitAvailable 检查git命令是否可用
func (g *GitService) isGitAvailable() bool {
	_, err := exec.LookPath("git")
	return err == nil
}

// getEnvWithGitPath 获取包含常见Git路径的环境变量
func (g *GitService) getEnvWithGitPath() []string {
	env := os.Environ()
	
	// 在Linux环境下，添加常见的git路径
	pathVar := ""
	for _, e := range env {
		if strings.HasPrefix(e, "PATH=") {
			pathVar = e[5:] // 去掉"PATH="前缀
			break
		}
	}
	
	// 添加常见的git安装路径
	commonGitPaths := []string{
		"/usr/bin",
		"/usr/local/bin",
		"/bin",
		"/usr/local/git/bin",
		"/opt/git/bin",
	}
	
	// 构建新的PATH
	newPath := pathVar
	for _, gitPath := range commonGitPaths {
		if !strings.Contains(newPath, gitPath) {
			if newPath != "" {
				newPath += ":"
			}
			newPath += gitPath
		}
	}
	
	// 更新环境变量
	newEnv := make([]string, 0, len(env))
	pathUpdated := false
	for _, e := range env {
		if strings.HasPrefix(e, "PATH=") {
			newEnv = append(newEnv, "PATH="+newPath)
			pathUpdated = true
		} else {
			newEnv = append(newEnv, e)
		}
	}
	
	// 如果没有PATH环境变量，添加一个
	if !pathUpdated {
		newEnv = append(newEnv, "PATH="+newPath)
	}
	
	return newEnv
}

// GetGitRootDir 获取Git仓库根目录
func (g *GitService) GetGitRootDir() (string, error) {
	if !g.IsGitRepository() {
		wd, _ := os.Getwd()
		return "", fmt.Errorf("当前目录不是Git仓库 (工作目录: %s)", wd)
	}
	
	cmd := exec.Command("git", "rev-parse", "--show-toplevel")
	
	// 获取用户当前工作目录
	wd, err := os.Getwd()
	if err != nil {
		return "", fmt.Errorf("无法获取当前工作目录: %v", err)
	}
	cmd.Dir = wd
	
	// 设置环境变量，确保git命令能正常执行
	cmd.Env = g.getEnvWithGitPath()
	
	output, err := cmd.Output()
	if err != nil {
		return "", fmt.Errorf("获取Git仓库根目录失败 (工作目录: %s): %v", wd, err)
	}
	
	return strings.TrimSpace(string(output)), nil
}

// GetGitInfo 获取完整的Git信息
func (g *GitService) GetGitInfo() (*model.GitInfo, error) {
	info := &model.GitInfo{
		IsRepo: g.IsGitRepository(),
	}
	
	if !info.IsRepo {
		return info, fmt.Errorf("当前目录不是Git仓库")
	}
	
	// 获取分支信息
	branch, err := g.GetCurrentBranch()
	if err != nil {
		return info, err
	}
	info.Branch = branch
	
	// 获取根目录
	rootDir, err := g.GetGitRootDir()
	if err != nil {
		return info, err
	}
	info.RootDir = rootDir
	
	return info, nil
}